Universal OS 1.30 pour TI 89 et TI92 Plus
Copyright (C) 2000-2001. Tous droits rservs.
Disponible sur www.ticalc.org et www.ti-fr.org
ftp://jm.devel.bourges.net

I) Introduction

Universal OS est un noyau (kernel). Il fonctionne sur toutes les
calculatrices et il est 'entirement' (cf 'Particularits') compatible
avec DoorsOS II 0.99. Vous pouvez archiver n'importe quelle librairie et
excuter des programmes de plus de 8 ko directement, mme sur les
ROM 2.0x. Les niveaux de gris fonctionnent sur HW1 et HW2  condition
que le programme utilise une librairie rcente pour les grer :
graphlib, gray4lib, ou gray7lib  (les 8 niveaux de gris ne sont pas
supports sur HW2) par exemple.

Universal OS n'est pas termin : il reste encore quelques limitations.

Contenu :
- install : pour installer et dsinstaller
- kernel : le noyau (non ncessaire  la dsinstallation)

Universal OS est un 'freeware'. Sa distribution est encourage, tant que
les fichiers restent ensembles et non modififis depuis le moment o ils
ont t initialement distribus.

II) Installation et utilisation

Si vous possdez une HW2 2.0x, vous devez utilisez HW2Patch.

Lancez install. Vous pouvez maintenant utiliser n'importe quel programme
en assembleur. Seul ce programme install peut dsinstaller correctement
ce kernel.

NOTES :	- kernel doit tre dans le mme rpertoire que install.
	- Vous pouvez quitter le programme assembleur en cours 
	  n'importe quel moment ( moins que le programme en question
	  ne l'en empche), en appuyant sur ESC+ON.
	- Utilisez ce programme  vos risques. Je ne peux tre jug
	  responsable des dommages qui pourraient se produire.
	- N'INSTALLEZ PAS DoorsOS aprs avoir install Universal OS (
	  moins que vous l'ayez dsinstall depuis).
	- NE DESINSTALLEZ PAS Universal OS avec le programme de
	  dsinstallation livr avec DoorsOS ou un autre kernel.
        - Universal OS ne remplace pas automatiquement un ancien kernel,
	  ceci pour des raisons de scurit (comment puis-je savoir
	  comment dsinstaller un kernel ! Chacun a sa propre faon de
	  s'installer, Universal OS y compris).

III) Particularits

- util, userlib, gray4lib, gray7lib (sauf sur HW2), graphlib et linelib
  ont t reprogrammes et intgres (cad dans la variable 'kernel') 
  Universal OS.
  TOUTE LIBRAIRIE EXTERNE PORTANT L'UN DE CES NOMS NE SERA PAS PRISE EN
  COMPTE.
- Vous pouvez lancer le programme nomm 'doors'  l'aide de
  [Shift]+[ON]. Seule diffrence avec DoorsOS : [Shift]+[ON] fonctionne
  plus souvent.
- Tout reset est dtect par Universal OS qui affiche alors un menu :
  1) rinitialiser
  2) teindre
  3) transfrer toutes les variables dans une autre calculatrice
  Remarques :
  - grce  VTI pour pouvez aussi tous transfrer vers un ordinateur
  - lorsque vous teignez la calculatrice, il se peut qu'elle se
    rallume toute seule au plus deux secondes aprs (j'essaierai de
    trouver une solution  ce problme trange; tout ce que je sais pour
    le moment, c'est que c'est li au link).
  - ATTENTION ! Cette fonctionnalit ne garantit pas que les variables
    transfres ne plantent pas la calculatrice de destination. En
    effet, elles peuvent avoir t mal modifies s'il y a eu plantage.
    Le mieux, c'est de sauvegarder le contenu de la calculatrice de
    destination.
- Vous pouvez teindre la calculatrice  tout moment (mme quand AMS est
  occup)  l'aide de [2nd]+[ON].

- Universal OS ne rcupre pas la mmoire laisse alloue par un
  programme : je ne vois vraiment pas comment on peut savoir si un bloc
  mmoire est perdu ou est important. D'ailleurs, l'algorithme employ
  par DoorsOS est imparfait.
- les fonctions (un)reloc(2) ne sont pas supportes : par exemple,
  prosit ne fonctionnera pas. (Je pense que c'est le seul)
- la fonction userlib::exec ne supporte le programmes zipps : c'est la
  seule diffrence avec les librairies de DoorsOS II 0.98.

IV) Notes aux programmeurs

Ces remarques concernent aussi les programmeurs qui utilisent DoorsOS.

* ramcalls :

- Idle equ _RAM_CALL_015 :

  void Idle (void); (=> d0-d2/a0-a1 sont dtruits)

  Soit I le masque d'interruption, Idle retourne ds qu'une interruption
  AIn avec n > I se dclenche. Il y a donc une diffrence notable avec
  tios::idle : quel que soit I, tios::idle retourne si n > 1,  moins
  qu'une touche est maintenue, auquel cas il retourne aussi si n = 1.

  => Alors que cette fonction permet d'conomiser davantage d'nergie,
  remplacer btement tios::idle par Idle dans un programme augmentera la
  consommation ! En fait, Idle permet  userlib/util::idle_loop d'tre
  plus efficace, notamment lorsque les niveaux de gris sont activs.
  Pour utiliser cette fonction de manire efficace, il faudra s'occuper
  de I si c'est possible.
  => Idle ne pourra jamais se comporter exactement comme tios::idle
  (hormis quand userlib/util::idle_loop l'utilise mais elle a accs 
  une variable interne). tios::idle pourra encore tre utile si les
  niveaux de gris ne sont pas activs.

  Contrairement  tios::idle, Idle fonctionne correctement sur VTI. Il
  ne s'agit pas de diminuer la consommation (!) mais de respecter les
  temps d'excution.

- Les autres ramcalls sont documentes dans DoorsOS.

* userlib :

- userlib::KbdMgr equ userlib@0012 :

  En entre, elle demande dans a0 l'adresse d'une fonction, qui sera
  appele par KbdMgr avec un paramtre dans d0.l :
  - d0.l > 0 : code de la touche qui a t presse
  - d0.l = 0 : temps spcifi coul
  Cette fonction peut agir en consquence et doit rpondre  travers
  d0.l :
  - d0.l >= 0 : KbdMgr quitte avec cette valeur
  - d0.l < 0 : ~d0.l (~ = not) indique un dlai en ms (millisecondes)
    Le dlai est compt  partir du dernier appel avec d0.l, ce qui
    signifie que si lors appui a lieu au bout de 0.1 s d'attente,
    retourner ~1000 rendra le contrle 0.9 s plus tard. La gestion du
    clavier ne perturbe donc pas le timer. Si vous voulez quand mme que
    KbdMgr rende rappelle la fonction 1 s plus tard, il faut d'abord
    retourner ~0.
  L'APD est support. Idle est utilise. KbdMgr est rentrante. En cas
  d'erreur, d0.l < 0.

  Registres d1-a6 : KbdMgr n'en dtruit aucun, et ils sont passs  la
  fonction spcifie lors de l'appel  KbdMgr.

  Tout comme userlib/util::idle_loop, cette fonction repose sur l'AI1 du
  tios. D'ailleurs, idle_loop se rsume  ceci :

  idle_loop:
	move.l	a0,-(a7)
	lea	IdleLoopCallBack(pc),a0
	jsr	KbMgr
	move.l	(a7)+,a0
	rts
  IdleLoopCallBack:
	tst.w	d0
	bne.b	ILCBret
	move.l	#$80000000,d0 ; attendre
  ILCBret:
	rts	;  24j 20h 31min 23.647s :)

  Il y a tout de mme une diffrence avec la routine idle_loop
  d'Universal OS : voir les remarques sur Idle.

* le point de sortie _exit :

Imaginez ce cas : une librairie A utilise, dans sa section _exit, une
librairie B et de mme, B utilise A dans sa section _exit. Si A ou B
a besoin d'une information qu'elle a supprim auparavant alors il y a un
bogue, aussi sophistique la protection Anti Crash puisse tre.
Donc n'utilisez pas de librairies  cet endroit.

* Compatibilit

Pour qu'il n'y ait plus de problmes lis  de nouvelles versions de
ROM, vitez les constantes et prfrez les RAM_CALL et les librairies,
PUIS les ROM_CALL.
En effet, TI a chang quelques ROM_CALL avec la ROM 2.xx : par exemple,
_ROM_CALL_15C ne pointe plus sur la routine EM_blockErase mais sur une
variable en rapport avec le clavier.
N'utilisez pas LCD_MEM si le programme est en niveau de gris ! Il existe
des variables et des fonctions adaptes.

Faites en sorte que vos programmes soient compatibles  la fois sur la
TI 89 et la TI92 Plus. Ceci concerne surtout le clavier.

* le fichier d'en-tte DoorsOS.h :

N'utilisez pas :
- doorsos::caddcert		equ	_ROM_CALL_126
  doorsos::cfindcertfield	equ	_ROM_CALL_129
  doorsos::cgetcert		equ	_ROM_CALL_12C
  doorsos::cgetvernum		equ	_ROM_CALL_131
  doorsos::EM_blockErase	equ	_ROM_CALL_15C
  doorsos::EM_blockVerifyErase	equ	_ROM_CALL_15D
  doorsos::EM_delete		equ	_ROM_CALL_15E
  doorsos::EM_open		equ	_ROM_CALL_163
  doorsos::EM_put		equ	_ROM_CALL_164
  doorsos::EM_writeToExtMem	equ	_ROM_CALL_168
- APD_INIT	equ	LCD_MEM+$F10
  APD_TIMER	equ	LCD_MEM+$F14
  APD_FLAG	equ	LCD_MEM+$F42
  mais les fonctions userlib::get_APD et userlib::set_ADP.
- doorsos::ER_throw macro
   dc.w $A000+\1
   endm
  par scurit, mme si j'ai amlior la protection Anti Crash pour que
  le programme quitte le plus proprement possible.

* les appels  la ROM  :

Considrez que toutes les fonctions de tios dtruisent D0-D2/A0-A1 :
ceci explique pourquoi Falldown and Tetris ne sauvegardent pas les noms
sur les ROM 2.xx. Donc faites attention avec les macros WriteStr et
WriteStrA.

V) Problmes connus

Universal OS utilise la pile superviseur pour y sauver des informations
importantes. Mais certains programmes boggus crivent  cet endroit :
avec d'autres noyaux, ce genre de bogue est invisible puisqu'ils n'y
sauvent rien, mais avec Universal OS, la calculatrice peut se planter.

VI) A faire

- supporte les fonctions reloc
- finir la fonction userlib::exec pour qu'elle puisse excuter des
  programmes zipps.
- empcher les fonctions graphiques d'crire en dehors du plan
  selectionn si les coordonnes sont mauvaises et reporter le bug par
  un message.

VII) Historique

01/05/2001 : Universal OS 1.30
- Support des programmes C qui ont t compils avant que le support de
  exit et de atexit soit corrig.
- Universal OS dtecte s'il est lanc sur VTI.
- VTI HW2 (note : si le boot code est absent, AMS 2.0x considre que
  c'est une HW2, mais Universal OS ragit de la mme manire que AMS
  1.0x et dtecte une HW1) :
  - Le port $70001D est 'mul' pour que la routine HW2 de niveaux de
    gris fonctionne.
  - AMS 2.0x : HW2Patch n'est pas ncessaire  l'installation.
- La barre d'tat est redessine lors de la restauration de l'cran,
  pour que il soit synchronis avec les changements apports par les
  programmes lancs.
- Correction d'un bug dans ReturnValue (_RAM_CALL_00F).
- Pour les programmeurs (cf IV) :
  - Ajout de la ramcall Idle : cette fonction a le mme but que
    tios::idle mais corrige de gros dfauts :
    - Lorsque les niveaux de gris sont activs, Idle laisse l'AI1 se
      dclencher normalement pour viter le clignotement.
    - Sous VTI, le port $600005 est mul pour viter les erreurs au
      niveau du temps d'excution.
  - Ajout de userlib::KbdMgr. En fait, elle tait dj prsente, mais
    non documente et bogue. 

20/01/2001 : Universal OS 1.21
- HW2 : Nouveau gestionnaire de niveau de gris, thoriquement parfait.
  J'ai abandonn l'implmentation de Johan Eilert
  (http://alh.dhs.org/ti89/hw2graypost.html) mais j'ai gard son ide
  (viter de rafrachir les lignes qui sont en train d'tre affiches,
  en utilisant le port $70001D).

11/01/2001 : Universal OS 1.20
- HW2 : Niveaux de gris parfaits ne ncessitant pas de rglage (en fait
  si !). adjust est donc retir et les commandes [<>]+[<] et [<>]+[>]
  n'ont plus aucun effet.
  La technique utilise est celle trouve par Johan Eilert. Toutefois,
  je n'ai pas russi  implmenter sa technique exactement comme il la
  dcrit  http://alh.dhs.org/ti89/hw2graypost.html.
  Merci beaucoup  Thibaut Giesi et  Flavien Racine pour avoir effectu
  tous les tests sur 89 et 92+. Cela leur a pris des heures.
- Lorsqu'on teint la calculatrice avec Universal OS ([2nd]+[ON]),
  l'indicateur busy est affich, comme c'est le cas avec AMS.
  Personnellement, je trouve ceci tout  fait inutile mais on me l'a
  demand.
- Correction d'un bug dans kernel:exec.

15/10/2000 : Universal OS 1.14
- Support de la ramcall HW_VERSION.
- Correction d'un bug dans userlib/util:exec.

28/05/2000 : Universal OS 1.13
- HW2 89&92+ : le rglage des niveaux de gris par [<>]+[<] et [<>]+[>]
  devrait fonctionner plus souvent.
- La fonction idle_loop ne modifie plus l'indicateur d'activit (il ne
  l'efface mme pas, contrairement aux librairies de DoorsOS).

25/05/2000 : Universal OS 1.12
- HW2 89&92+ : rglage des niveaux de gris  l'aide de [<>]+[<] et
  [<>]+[>] (adjust permet de mieux valuer la qualit des niveaux de
  gris).
- HW2 : correction d'un bogue dans graphlib::gray4.
- L'utilisation de [Shift]+[ON] n'empche plus le basic depuis un
  programme assembleur : il tait par exemple impossible d'appeler un
  programme basic depuis "doors".

11/05/2000 : Universal OS 1.11
- Amlioration des niveaux de gris sur HW2 89 (merci  Olivier Serres).
- [Shift]+[ON] support : cela lance le programme "doors".
- Mise  jour de userlib : ajout de userlib::password.
- Mise  jour des routines de niveaux de gris :
  - initialisation des plans de bits.
  - gestion du page flipping sous graphlib.
- Tous les problmes de valeurs de retour sont rsolus (c'taient deux
  bugs : un dans AMS 2.0x et un dans Universal OS).
- Universal OS dtecte si HW2Patch est ncessaire.
- Sur HW2 : la dsinstallation ne ractive plus la limitation matrielle
  des 8 ko, si on avait choisi la mthode qui ne modifie pas la ROM.
- Correction de bogues.


27/02/2000 : Universal OS 1.10
- Possibilit de sauvegarder toutes les variables juste avant un reset.
- [2nd]+[ON] fonctionne mme lorsque AMS est occup.
- le fichier kernel peut tre archiv.
- Possibilit de ne pas mettre de mot de passe.
- Correction de quelques bogues dans :
  - graphlib::clr_scr2 (dcidment !)
  - les routines de niveaux de gris.
  - kernel::exec

08/01/2000 : Universal OS 1.02
- Les librairies peuvent tre dans n'importe quel rpertoire.
- Correction du bogue dans graphlib::clr_scr2.

03/01/2000 : Universal OS 1.01
- Correction de quelques bogues au niveau de :
  - doorsos::kb_globals (_RAM_CALL_010)
  - util::clr_scr
  - userlib::lockcalc
  - checksum de Phoenix

02/01/2000 : Universal OS 1.00

VIII) Comment me contacter

e-mail : <Julien.Muchembled@netcourrier.com>

Reportez tous les bogues que vous trouvez, sans oublier de donner une
description prcise du problme.

Remarque  propos du courrier :

Si possible, allez sur le forum de www.ti-fr.org. a peut intresser
tout le monde et je n'aurais plus qu'un seul message  crire par
problme.